#include "server_Servidor.h"

//si se llamo a esto,todos los threads habidos y por haber ya deberian estar parados
//Se debio haber llamado al liberar, antes
Servidor::~Servidor()
{
    //std::cout << "Servidor Principal no existe mas" << std::endl;
}

    //se debe ejecutar esto antes de proceder con el Aceptar()
int Servidor::Listen( short Puerto )
{
    // Primero bind, luego Listen
    struct sockaddr_in ServerAdd;

    ServerAdd.sin_family = AF_INET;

    ServerAdd.sin_port = htons ( Puerto );

    ServerAdd.sin_addr.s_addr = htonl(INADDR_ANY);

    memset(&(ServerAdd.sin_zero) ,'\0', 8 );
    int optval;
    optval = 1;
    setsockopt(this->NumSocket,SOL_SOCKET, SO_REUSEADDR, &optval, sizeof optval);
    int ret = bind ( this->NumSocket
                    , (struct sockaddr *)&ServerAdd
                    ,sizeof(struct sockaddr) );

    if ( ret == -1 )
    {
        throw MyException("No se pudo bindear" + std::string(strerror(errno)));
    }

    ret = listen ( this->NumSocket , BACKLOG );

    if ( ret == -1 )
    {
        throw MyException("No se puede Listenear" + std::string(strerror(errno)));
    }

    return ret;
}

    //devuelve socket conectado con el cliente que esta llamando
int Servidor::Aceptar()
{
    struct sockaddr_in IncSockInfo;
    socklen_t size = sizeof(struct sockaddr_in);

    /*int retval = this->Select(Segundos);
    if ( retval == -1 ){
        throw MyException("No se pudo select"+ std::string(strerror(errno)));
    }

    if ( retval == 0){
        return -1;
    }*/

    int Socket_New = accept ( this->NumSocket ,(struct sockaddr *) &IncSockInfo , &size );
    if ( (Socket_New == -1) && (this->r) )
    {
        throw MyException("No se pudo aceptar Conexion."+ std::string(strerror(errno)));
    }
    return Socket_New;
}
